home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / dev / c / RConfig.lha / RConfig_v1.1 / rlib / _main.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-09-19  |  5.6 KB  |  214 lines

  1. /*
  2.  * _main.c
  3.  * ~~~~~~~
  4.  *   Copyright (C) 1986,1987 by Manx Software Systems, Inc.
  5.  *   Copyright (C) 1992 by Anthon Pang, Omni Communications Products.
  6.  *
  7.  *   This is common startup code for both the CLI and the WorkBench.
  8.  *   When called from the WorkBench, argc is 0 and argv points to a
  9.  *   WBStartup type of structure.
  10.  */
  11.  
  12. #include <fcntl.h>
  13. #include <exec/alerts.h>
  14. #include <exec/memory.h>
  15. #include <libraries/dosextens.h>
  16. #include <workbench/startup.h>
  17. #include <stdlib.h>
  18. #include <string.h>
  19. #include <clib/dos_protos.h>
  20. #include <clib/exec_protos.h>
  21. #include <pragmas/dos_lib.h>
  22. #include <pragmas/exec_lib.h>
  23.  
  24. /*
  25.  * globals
  26.  */
  27. extern long _savsp, _stkbase;
  28. extern int errno;
  29. extern int Enable_Abort;
  30. extern int _argc, _arg_len;
  31. extern char **_argv, *_arg_lin;
  32. extern struct WBStartup *WBenchMsg;
  33. extern struct _dev *_devtab;
  34. extern short _numdev;
  35.  
  36. #ifdef __DETACH_MAIN
  37. extern long _stack, _priority, _BackGroundIO;
  38. extern char *_procname;
  39. extern BPTR _detach_curdir;
  40. extern char *_detach_name;
  41. #endif
  42.  
  43. /*
  44.  * external functions
  45.  */
  46. extern void _cli_parse(struct Process *pp, long alen, char *aptr);
  47. extern void _wb_parse(struct Process *pp, struct WBStartup *WBenchMsg);
  48. extern int main(int argc, char **argv);
  49. extern void (*_cln)(void);
  50.  
  51. /*
  52.  * _main.c
  53.  */
  54. #ifdef __DETACH_MAIN
  55. static void do_detach(long *alen, char **aptr);
  56. #endif
  57.  
  58. void _main(long alen, char *aptr) {
  59.     register struct Process *pp;
  60.  
  61. #ifdef __DETACH_MAIN
  62.     do_detach(&alen, &aptr);
  63. #endif
  64.  
  65.     if ((_devtab = AllocMem(_numdev*(long)sizeof(struct _dev),
  66.           MEMF_CLEAR)) == 0) {
  67.         Alert(AG_NoMemory);
  68. #asm
  69.         move.l  __savsp,sp      ;get back original stack pointer
  70.         rts                     ;and exit
  71. #endasm
  72.     }
  73.  
  74.     _devtab[0].mode = O_RDONLY;
  75.     _devtab[1].mode = _devtab[2].mode = O_WRONLY;
  76.  
  77.     _stkbase = _savsp - *((long *)_savsp+1) + 8;
  78.     *(long *)_stkbase = 0x4d414e58L;
  79.  
  80.     pp = (struct Process *)FindTask(0L);
  81.  
  82. #ifdef __DETACH_MAIN
  83.     if (alen) {
  84. #else
  85.     if (pp->pr_CLI) {
  86. #endif
  87.         _cli_parse(pp, alen, aptr);
  88.         Enable_Abort = 1;
  89. #ifndef __DETACH_MAIN
  90.         _devtab[0].mode |= O_STDIO;     /* shouldn't close if CLI */
  91.         _devtab[1].mode |= O_STDIO;
  92. #endif
  93.     } else {
  94.         WaitPort(&pp->pr_MsgPort);
  95.         WBenchMsg = (struct WBStartup *)GetMsg(&pp->pr_MsgPort);
  96.         if (WBenchMsg->sm_ArgList) {
  97.             CurrentDir(WBenchMsg->sm_ArgList->wa_Lock);
  98.             _wb_parse(pp, WBenchMsg);
  99.         }
  100.         _argv = (char **)WBenchMsg;
  101.     }
  102.     _devtab[0].fd = Input();
  103.     _devtab[1].fd = Output();
  104.     if (pp->pr_ConsoleTask)
  105.         _devtab[2].fd = Open((UBYTE *)"*", (long)MODE_OLDFILE);
  106.     exit(main(_argc, _argv));
  107. }
  108.  
  109. #ifdef __DETACH_MAIN
  110. BPTR _Backstdout = 0;
  111. static long _alen = 0;
  112. static char *_aptr = 0;
  113.  
  114. static void do_detach(long *alen, char **aptr) {
  115.     register struct Process *pp;
  116.     register unsigned short c;
  117.     register char *cp;
  118.     register struct CommandLineInterface *cli;
  119.     register long l;
  120.     long *lp, *sav;
  121.     struct MemList *mm;
  122.     struct Library *savlib;
  123.  
  124.     pp = (struct Process *)FindTask(0L);
  125.     if (pp->pr_CLI) {           /* first time through!! */
  126.         CurrentDir(_detach_curdir = CurrentDir(0L));
  127.         _detach_curdir = DupLock(_detach_curdir);
  128.  
  129.         cli = (struct CommandLineInterface *) ((long)pp->pr_CLI << 2);
  130.         l = cli->cli_Module;
  131.         if ((savlib = OpenLibrary((UBYTE *)DOSNAME, 33L)) == 0) {
  132.  
  133.             lp = (long *)*((long *)*((long *)*((long *)*((long *)
  134.                                             _savsp+2)+1)-3)-3)+107;
  135.             if (*lp != cli->cli_Module)
  136.                 exit(100);
  137.         } else {
  138.             CloseLibrary(savlib);
  139.             lp = 0;
  140.         }
  141.         if (lp)
  142.             *lp = 0;
  143.         if (_stack == 0)
  144.             _stack = cli->cli_DefaultStack * 4;
  145.         if (_BackGroundIO)
  146.             _Backstdout = (BPTR)Open((UBYTE *)"*", (long)MODE_OLDFILE);
  147.         _alen = *alen;
  148.         if ((_aptr = AllocMem(_alen, 0L)) == 0)
  149.             goto cleanup;
  150.         memmove(_aptr, *aptr, (size_t)_alen);
  151.         cp = (char *)((long)cli->cli_CommandName << 2);
  152.         if ((_detach_name = AllocMem((long)cp[0]+1, 0L)) == 0)
  153.             goto cleanup;
  154.         memmove(_detach_name, cp, (size_t)cp[0]+1);
  155. #asm
  156.         move.l  __savsp,-(sp)
  157. #endasm
  158.         if (CreateProc((UBYTE *)_procname, _priority, l, _stack)) {
  159.             cli->cli_Module = 0;
  160.             l = 0;
  161.         } else {
  162. cleanup:
  163.             if (_aptr)
  164.                 FreeMem(_aptr, _alen);
  165.             if (_detach_name)
  166.                 FreeMem(_detach_name, (long)cp[0]+1);
  167.             l = 1001;
  168.         }
  169.         ;
  170. #asm
  171.         move.l  (sp)+,sp
  172.         move.l  %%l,d0
  173.         rts
  174. #endasm
  175.     } else if (_alen) { /* second time */
  176.         lp = (long *)((long)pp->pr_SegList << 2);
  177.         lp = (long *)(lp[3] << 2);
  178.         sav = lp;
  179.         c = 2;
  180.         while (lp) {
  181.             lp = (long *)(*lp << 2);
  182.             c++;
  183.         }
  184.         mm = AllocMem((long)sizeof(struct MemList)+
  185.                             (c-1)*sizeof(struct MemEntry), 0L);
  186.         lp = sav;
  187.         mm->ml_NumEntries = c;
  188.         c = 0;
  189.         while (lp) {
  190.             mm->ml_me[c].me_Addr = (APTR)((unsigned long)(lp - 1));
  191.             mm->ml_me[c].me_Length = lp[-1];
  192.             lp = (long *)(*lp << 2);
  193.             c++;
  194.         }
  195.         mm->ml_me[c].me_Addr = (APTR)_aptr;
  196.         mm->ml_me[c++].me_Length = _alen;
  197.         mm->ml_me[c].me_Addr = (APTR)_detach_name;
  198.         mm->ml_me[c++].me_Length = _detach_name[0] + 1;
  199.  
  200.         AddTail(&pp->pr_Task.tc_MemEntry, &mm->ml_Node);
  201.  
  202.         CurrentDir(_detach_curdir);
  203.  
  204.         pp->pr_COS = _Backstdout;
  205.  
  206.         *alen = _alen;
  207.         *aptr = _aptr;
  208.  
  209.         if (!_BackGroundIO)
  210.             pp->pr_ConsoleTask = 0;
  211.     }
  212. }
  213. #endif
  214.